#include <gpio.h>
#include <STC8G.H>
#include <basic.h>

void GPIO_Init(GPIO_Port port, GPIO_Pin pin, GPIO_Mode mode)
{
    switch (port)
    {
    case GPIO_PORT_1:
        switch (mode)
        {
        case GPIO_MODE_QUASI_BIDIRECTIONAL:
            P1M1 &= ~(1 << pin);//0
            P1M0 &= ~(1 << pin);//0
            break;
        case GPIO_MODE_PUSH_PULL:
            P1M1 &= ~(1 << pin);//0
            P1M0 |= (1 << pin);//1
            break;
        case GPIO_MODE_INPUT_ONLY:
            P1M1 |= (1 << pin);//1
            P1M0 &= ~(1 << pin);//0
            break;
        case GPIO_MODE_OPEN_DRAIN:
            P1M1 |= (1 << pin);//1
            P1M0 |= (1 << pin);//1
            break;
        }
        break;
    case GPIO_PORT_3:
        switch (mode)
        {
        case GPIO_MODE_QUASI_BIDIRECTIONAL:
            P3M1 &= ~(1 << pin);
            P3M0 &= ~(1 << pin);
            break;
        case GPIO_MODE_PUSH_PULL:
            P3M1 &= ~(1 << pin);
            P3M0 |= (1 << pin);
            break;
        case GPIO_MODE_INPUT_ONLY:
            P3M1 |= (1 << pin);
            P3M0 &= ~(1 << pin);
            break;
        case GPIO_MODE_OPEN_DRAIN:
            P3M1 |= (1 << pin);
            P3M0 |= (1 << pin);
            break;
        }
        break;
    case GPIO_PORT_5:
        switch (mode)
        {
        case GPIO_MODE_QUASI_BIDIRECTIONAL:
            P5M1 &= ~(1 << pin);
            P5M0 &= ~(1 << pin);
            break;
        case GPIO_MODE_PUSH_PULL:
            P5M1 &= ~(1 << pin);
            P5M0 |= (1 << pin);
            break;
        case GPIO_MODE_INPUT_ONLY:
            P5M1 |= (1 << pin);
            P5M0 &= ~(1 << pin);
            break;
        case GPIO_MODE_OPEN_DRAIN:
            P5M1 |= (1 << pin);
            P5M0 |= (1 << pin);
            break;
        }
        break;
    }
}
void GPIO_Set(GPIO_Port port, GPIO_Pin pin, GPIO_State state)
{
    switch (port)
    {
    case GPIO_PORT_1:
        if (state == GPIO_STATE_HIGH)
        {
            P1 |= (1 << pin);
        }
        else if (state == GPIO_STATE_LOW)
        {
            P1 &= ~(1 << pin);
        }
        break;
    case GPIO_PORT_3:
        if (state == GPIO_STATE_HIGH)
        {
            P3 |= (1 << pin);
        }
        else if (state == GPIO_STATE_LOW)
        {
            P3 &= ~(1 << pin);
        }
        break;
    case GPIO_PORT_5:
        if (state == GPIO_STATE_HIGH)
        {
            P5 |= (1 << pin);
        }
        else if (state == GPIO_STATE_LOW)
        {
            P5 &= ~(1 << pin);
        }
        break;
    }
}
GPIO_State GPIO_Get(GPIO_Port port, GPIO_Pin pin)
{
    switch (port)
    {
    case GPIO_PORT_1:
        if (P1 & (1 << pin))
        {
            return GPIO_STATE_HIGH;
        }
        else
        {
            return GPIO_STATE_LOW;
        }
        break;
    case GPIO_PORT_3:
        if (P3 & (1 << pin))
        {
            return GPIO_STATE_HIGH;
        }
        else
        {
            return GPIO_STATE_LOW;
        }
        break;
    case GPIO_PORT_5:
        if (P5 & (1 << pin))
        {
            return GPIO_STATE_HIGH;
        }
        else
        {
            return GPIO_STATE_LOW;
        }
        break;
    }
		return GPIO_STATE_HIGH;
}
